package rewind.show.es.anno;

import java.lang.annotation.*;

/**
 * 用于标记实体类为 ES 索引数据格式<br/>
 * <br/>
 * <h4>分片和副本</h4>
 * shards数据分片，是ES的数据载体。在ES中数据分为primary shard（主分片）和replica shard（副本分片），每一个primary承载单个索引的一部分数据，
 * 分布于各个节点，replica为某个primary的副本，即备份。<br/>
 * <br/>
 * 在 ES7 之前,默认索引为5主1副,ES7之后为1主1副。<br/>
 * 5主1副,默认5个primary shard，每个primary shard默认分配一个replica。<br/>
 * <br/>
 * Paimary只能在索引创建时配置数量，而replica可以在任何时间分配，并且primary支持读和写操作，而replica只支持客户端的读取操作，数据由es自动管理，从primary同步。<br/>
 * 如果需要修改索引分片配置,可用reindex重建索引,<a href="https://juejin.cn/post/7339341982836621363">修改索引分片数方案</a> <br/>
 * <br/>
 * ES不允许Primary和它的Replica放在同一个节点中，并且同一个节点不接受完全相同的两个Replica同一个节点允许多个索引的分片同时存在。<br/>
 * <br/>
 * <h4>分片数量如何决策</h4>
 * 避免分片过多：大多数搜索会命中多个分片。每个分片在单个 CPU 线程上运行搜索。虽然分片可以运行多个并发搜索，但跨大量分片的搜索会耗尽节点的搜索线程池。
 * 这会导致低吞吐量和缓慢的搜索速度。<br/>
 * <br/>
 * 分片越少越好：每个分片都使用内存和 CPU 资源。在大多数情况下，一小组大分片比许多小分片使用更少的资源。<br/>
 * <br/>
 * <h4>分片大小如何决策</h4>
 * 分片的合理容量：10GB-50GB。虽然不是硬性限制，但 10GB 到 50GB 之间的分片往往效果很好。根据网络和用例，也许可以使用更大的分片。
 * 在索引的生命周期管理中，一般设置50GB为单个索引的最大阈值。<br/>
 * 堆内存容量和分片数量的关联：小于20分片/每GB堆内存，一个节点可以容纳的分片数量与节点的堆内存成正比。例如，一个拥有 30GB 堆内存的节点最多应该有 600 个分片。
 * 如果节点超过每 GB 20 个分片，考虑添加另一个节点。<br/>
 *
 * https://blog.csdn.net/xiaoyida11/article/details/107063095
 */
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface EsDocument {

    /**
     * 索引名称
     * <ul>
     * <li>Lowercase only</li>
     * <li><Cannot include \, /, *, ?, ", <, >, |, ` ` (space character), ,, #/li>
     * <li>Cannot start with -, _, +</li>
     * <li>Cannot be . or ..</li>
     * <li>Cannot be longer than 255 bytes (note it is bytes, so multi-byte characters will count towards the 255 limit
     * faster)</li>
     * </ul>
     */
    String index();

    /**
     * 索引分片
     */
    int shards() default 1;

    /**
     * 索引副本
     */
    int replicas() default 1;
}
